💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    4. admin작성 | ✅ 저자: 이유정(박사)

    list_display ,fields, search_fields... 이런 변수들은 장고가 공식적으로 제공하는 admin 옵션 변수입니다.

    admin.py

    from django.contrib import admin
    
    from .models import (
        Article,
        Restaurant,
        RestaurantCategory,
        RestaurantImage,
        RestaurantMenu,
        Review,
        ReviewImage,
        SocialChannel,
        Tag,
    )
    
    @admin.register(Article)
    class ArticleAdmin(admin.ModelAdmin):
        list_display = [
            "id",
            "title",
            "show_at_index",
            "is_published",
            "created_at",
            "modified_at",
        ]
        
    # 개별 객체를 추가하거나 수정할 때 보여줄 필드를 지정함(편집 화면에서 보임)
    # Admin에서 글을 생성하거나 수정할 때 이 필드들만 폼에 나타남
        fields = ["title", "preview_image", "content", "show_at_index", "is_published"]
        search_fields = ["title"]
        list_filter = ["show_at_index", "is_published"]
        date_hierarchy = "created_at"
        actions = ["make_published"]
    
        @admin.action(description="선택한 컬럼을 공개상태로 변경합니다.")
        def make_published(self, request, queryset):
            queryset.update(is_published=True)
    
    @admin.register(Tag)
    class TagAdmin(admin.ModelAdmin):
        list_display = ["id", "name"]
        fields = ["name"]
        search_fields = ["name"]
    
    class RestaurantMenuInline(admin.TabularInline):
        model = RestaurantMenu
        extra = 1
    
    class RestaurantImageInline(admin.TabularInline):
        model = RestaurantImage
        extra = 1
    
    @admin.register(Restaurant)
    class RestaurantAdmin(admin.ModelAdmin):
        list_display = [
            "id",
            "name",
            "branch_name",
            "is_closed",
            "phone",
            "rating",
            "rating_count",
        ]
        fields = [
            "name",
            "branch_name",
            "category",
            "is_closed",
            "phone",
            "latitude",
            "longitude",
            "tags",
        ]
        readonly_fields = ["rating", "rating_count"]
        search_fields = ["name", "branch_name"]
        list_filter = ["tags"]
        autocomplete_fields = ["tags"]
        inlines = [RestaurantMenuInline, RestaurantImageInline]
    
        # 인스턴스를 생성할때 인라인 표시 안하도록
        def get_inline_instances(self, request, obj=None):
            return obj and super().get_inline_instances(request, obj) or []
    
    @admin.register(RestaurantCategory)
    class RestaurantCategoryIAdmin(admin.ModelAdmin):
        list_display = ["name"]
        fields = ["cuisine_type", "name"]
    
    class ReviewImageInline(admin.TabularInline):
        model = ReviewImage
        extra = 1
    
    @admin.register(Review)
    class ReviewAdmin(admin.ModelAdmin):
        list_display = ["id", "restaurant_name", "author", "rating", "content_partial"]
        inlines = [ReviewImageInline]
    
        # 인스턴스를 생성할때 인라인 표시 안하도록
        def get_inline_instances(self, request, obj=None):
            return obj and super().get_inline_instances(request, obj) or []
    
    @admin.register(SocialChannel)
    class SocialChannelAdmin(admin.ModelAdmin):
        list_display = ["id", "name"]
        fields = ["name"]
    

    fields = ["title", "preview_image", "content", "show_at_index", "is_published"]

    list_display = [ "id", "title", "show_at_index", "is_published", "created_at", "modified_at"]

    search_fields = ["title"]

    list_filter = ["show_at_index", "is_published"]

    date_hierarchy = "created_at"

    actions = ["make_published"]

    데코레이션이 없는 이유: 이 클래스들은 InlineModelAdmin, 즉 인라인 모델 등록용 클래스입니다. RestaurantMenu는 Restaurant 객체를 수정할 때 같이 나타납니다. 왼쪽 메뉴에 "RestaurantMenu"라는 항목은 아예 없습니다. 대신, 레스토랑 수정 화면 안에 탭 형태로 들어가 있습니다.

    class RestaurantMenuInline(admin.TabularInline):
        model = RestaurantMenu
        extra = 1 
    
    class RestaurantImageInline(admin.TabularInline):
        model = RestaurantImage
        extra = 1
    
    readonly_fields = ["rating", "rating_count"]
    search_fields = ["name", "branch_name"]
    list_filter = ["tags"]
    autocomplete_fields = ["tags"]
    # 수정할때만 보여지는 폼
    inlines = [RestaurantMenuInline, RestaurantImageInline] 
    
    # 수정할 때만 인라인 폼을 보여주고, 새로 생성할 때는 인라인폼을 숨기는 역할
    def get_inline_instances(self, request, obj=None):
    	return obj and super().get_inline_instances(request, obj) or []
    

    readonly_fields = ["rating", "rating_count"]

    • 설명: 관리자 페이지에서 rating, rating_count 필드는 읽기 전용(수정 불가) 으로 표시됩니다.
    • 용도: 평점과 평점 수는 보통 사용자 활동(리뷰 등)에 따라 자동 계산되므로, 관리자가 직접 입력할 필요가 없기 때문입니다.
    • UI: 해당 필드에 입력창 없이 값만 표시됨 (비활성화 상태)

    search_fields = ["name", "branch_name"]

    • 설명: 관리자 상단의 검색창에서 레스토랑 이름과 지점명으로 검색 가능하게 만듭니다.
    • 예시: “강남” 또는 “스테이크” 등으로 검색하면 일치하는 이름/지점이 필터됨
    • UI: 검색어 입력 → 결과 필터링됨

    list_filter = ["tags"]

    • 설명: 오른쪽 사이드바에 필터 목록이 생겨, Tag로 레스토랑을 분류/필터링할 수 있습니다.
    • 예시: "맛집" 태그를 클릭하면 해당 태그가 달린 레스토랑만 목록에 표시됨
    • UI: 우측에 체크박스/옵션 필터링 메뉴가 생김

    autocomplete_fields = ["tags"]

    • 설명: 태그 선택 시, 기존 태그 목록을 자동완성 방식으로 입력할 수 있게 합니다.
    • 장점: 태그가 많을수록 성능이 좋고, UX가 개선됩니다.
    • 필수 조건: Tag 모델에는 __str__() 메서드가 잘 정의되어 있어야 함.
    • 자동완성 제안기능으로 기존에 존재하는 태그를 쉽게 선택 가능합니다.

    레스토랑 등록할때는 레스토랑메뉴와 레스토랑 이미지가 안보입니다.

    수정할때 나타납니다.

    TOP
    preload preload